package org.aliwo.syn;

/**
 * @author xuyayuan
 * @data 2021年06月19日
 * 模拟线程死锁
 * 多个线程都占用了对方的锁资源，但不肯相让，导致了死锁，在编程是一定要避免死锁的发生。
 */
public class DaemonThread {
    public static void main(String[] args) {
        TestDaemon A = new TestDaemon(true);
        TestDaemon B = new TestDaemon(false);
        A.setName("线程A ");
        A.start();
        B.setName("线程B ");
        B.start();
    }
}

class TestDaemon extends Thread {
    static Object o1 = new Object(); // 保证多个线程，共享一个对象
    static Object o2 = new Object();
    boolean flag;

    public TestDaemon(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        // 业务逻辑分析
        // 一：如果flag为true，线程A 就会先持有o1对象锁，然后去尝试获取o2对象锁
        // 二：如果线程A 得不到o2对象锁，就会Blocked
        // 三：如果flag为false，线程B 就会先持有o2对象锁，然后去尝试获取o1对象锁
        // 四：如果线程F 得不到o1对象锁，就会Blocked
        if (flag) {
            synchronized (o1) {
                System.out.println(Thread.currentThread().getName() + "进入1");
                synchronized (o2) {
                    System.out.println(Thread.currentThread().getName() + "进入2");
                    System.out.println(Thread.currentThread().getName() + "进入2" + "线程状态 : " + Thread.currentThread().getState());
                }
            }
        } else {
            synchronized (o2) {
                System.out.println(Thread.currentThread().getName() + "进入3");
                synchronized (o1) {
                    System.out.println(Thread.currentThread().getName() + "进入4");
                    System.out.println(Thread.currentThread().getName() + "进入4" + "线程状态 : " + Thread.currentThread().getState());
                }
            }
        }
    }
}